Pipeline CI/CD complet autour d'un scanner de sécurité web en Python.
Tests automatisés → Build Docker → Scan CVE Trivy → Déploiement AWS EC2.
Ce projet met en œuvre un pipeline DevSecOps complet :
- Une application Python qui analyse les en-têtes HTTP de sécurité d'un site web
- Des tests unitaires avec
pytestet couverture de code - Une image Docker optimisée et sécurisée
- Un pipeline GitHub Actions (CI/CD) avec 4 jobs séquentiels
- Un scan de vulnérabilités CVE de l'image Docker avec
Trivy - Un déploiement automatique sur AWS EC2 via SSH
devops-ci-python-app/
│
├── app/
│ ├── __init__.py
│ └── scanner.py # Application principale
│
├── tests/
│ ├── __init__.py
│ └── test_scanner.py # Tests unitaires pytest
│
├── .github/
│ └── workflows/
│ └── ci.yml # Pipeline CI/CD GitHub Actions
│
├── Dockerfile # Conteneurisation de l'app
├── requirements.txt # Dépendances Python
├── .gitignore
└── README.md
Quand un navigateur visite un site web, le serveur renvoie des en-têtes HTTP dans sa réponse. Certains de ces en-têtes sont des directives de sécurité recommandées par l'OWASP pour protéger les utilisateurs contre différentes attaques.
| En-tête | Protection contre |
|---|---|
Strict-Transport-Security |
Force HTTPS, empêche les attaques MITM |
X-Content-Type-Options |
Empêche le MIME sniffing |
X-Frame-Options |
Protège contre le clickjacking |
Content-Security-Policy |
Empêche les injections XSS et données |
X-XSS-Protection |
Protection XSS (navigateurs anciens) |
Referrer-Policy |
Contrôle les données de navigation partagées |
# Installer les dépendances
pip install -r requirements.txt
# Scanner un site
python -m app.scanner https://example.com
# Exemple de sortie :
# 🔍 Analyse de : https://example.com
# 📡 Status HTTP : 200
# ✅ Score : 3 / 6 en-têtes présents
#
# ✅ En-têtes présents :
# ✔ Strict-Transport-Security
# ✔ X-Content-Type-Options
# ✔ X-Frame-Options
#
# ⚠️ En-têtes manquants :
# ✘ Content-Security-Policy
# ✘ X-XSS-Protection
# ✘ Referrer-PolicyLes tests sont écrits avec pytest et utilisent unittest.mock pour simuler les requêtes HTTP sans connexion internet — ce qui est essentiel pour un pipeline CI/CD stable et rapide.
# Tests simples
pytest tests/ -v
# Tests avec couverture de code
pytest tests/ -v --cov=app --cov-report=term-missing| Test | Description |
|---|---|
test_all_headers_present |
Score maximum si tous les en-têtes sont présents |
test_no_headers_present |
Score 0 si aucun en-tête |
test_partial_headers |
Score partiel avec 2 en-têtes |
test_http_error |
Gestion propre d'une erreur réseau |
test_status_code_returned |
Vérification du code HTTP retourné |
Docker permet d'empaqueter l'application avec toutes ses dépendances dans une image portable. Elle s'exécute de façon identique sur n'importe quelle machine ou serveur.
# Construire l'image
docker build -t devops-ci-python-app:latest .
# Lancer le scanner dans un conteneur
docker run devops-ci-python-app:latest
# Scanner une URL spécifique
docker run devops-ci-python-app:latest python -m app.scanner https://monsite.com- ✅ Image de base
python:3.11-slim(légère, moins de surface d'attaque) - ✅ Copie de
requirements.txten premier (optimisation du cache Docker) - ✅
--no-cache-dirpour réduire la taille de l'image - ✅ Pas de secrets dans l'image
Push sur main
│
▼
┌─────────┐ ┌─────────┐ ┌──────────┐ ┌─────────┐
│ TEST │───▶│ BUILD │───▶│ SCAN │───▶│ DEPLOY │
│ pytest │ │ Docker │ │ Trivy │ │ EC2 │
└─────────┘ └─────────┘ └──────────┘ └─────────┘
Les jobs sont séquentiels grâce au mot-clé needs. Si un job échoue, les suivants ne s'exécutent pas.
- Lance
pytestavec couverture de code - Si un test échoue → le pipeline s'arrête
- Construit l'image Docker
- Sauvegarde l'image comme artefact pour le job suivant
- Installe Trivy (scanner de CVE open-source d'Aqua Security)
- Scanne l'image Docker pour détecter les vulnérabilités HIGH et CRITICAL
- Affiche un rapport dans les logs
- Se connecte à l'instance AWS EC2 via SSH
- Met à jour le code (
git pull) - Rebuild et relance le conteneur Docker
Pour que le déploiement fonctionne, configurer ces secrets dans Settings → Secrets and variables → Actions :
| Secret | Description |
|---|---|
EC2_HOST |
Adresse IP publique de l'instance EC2 |
EC2_USER |
Utilisateur SSH (ex: ubuntu) |
EC2_SSH_KEY |
Contenu complet de la clé privée .pem |
Trivy est un scanner de sécurité open-source développé par Aqua Security. Il analyse les images Docker pour détecter des CVE (Common Vulnerabilities and Exposures) — c'est-à-dire des failles de sécurité connues dans les bibliothèques utilisées.
2024-01-15T10:23:45.123Z INFO Vulnerability scanning is enabled
┌──────────────┬────────────────┬──────────┬───────────────────┬──────────────────┐
│ Library │ Vulnerability │ Severity │ Installed Version │ Fixed Version │
├──────────────┼────────────────┼──────────┼───────────────────┼──────────────────┤
│ urllib3 │ CVE-2023-45803 │ MEDIUM │ 1.26.7 │ 1.26.18, 2.0.7 │
└──────────────┴────────────────┴──────────┴───────────────────┴──────────────────┘
Dans un contexte professionnel (banque, assurance, etc.), les équipes de sécurité exigent que les images déployées ne contiennent pas de vulnérabilités critiques. Intégrer Trivy dans le pipeline permet de bloquer automatiquement le déploiement si une faille CRITICAL est détectée.
- Instance : EC2 t2.micro (Free Tier)
- OS : Ubuntu 22.04 LTS
- Prérequis sur l'EC2 : Docker installé, Git installé, repo cloné
# Sur l'instance EC2 (connexion SSH initiale)
sudo apt update && sudo apt install -y docker.io git
sudo usermod -aG docker ubuntu
# Cloner le projet
git clone https://github.com/abdallah-76/devops-ci-python-app.git
cd devops-ci-python-app| Outil | Rôle |
|---|---|
| Python 3.11 | Langage de l'application |
| pytest | Framework de tests unitaires |
| Docker | Conteneurisation |
| GitHub Actions | Automatisation CI/CD |
| Trivy | Scan de vulnérabilités CVE |
| AWS EC2 | Hébergement cloud |
| SSH | Déploiement sécurisé |
Ce projet m'a permis de comprendre et mettre en pratique :
- La conteneurisation avec Docker et les bonnes pratiques de Dockerfile
- L'écriture de tests unitaires avec mocking pour isoler les dépendances
- La création d'un pipeline CI/CD complet avec des jobs séquentiels
- Le concept de DevSecOps : intégrer la sécurité dans le pipeline de développement
- La gestion des secrets dans GitHub Actions (jamais de credentials en clair)
- Le scan de vulnérabilités CVE avec Trivy sur une image Docker
- Le déploiement automatisé sur un serveur cloud via SSH
Abdallah Maammar
Étudiant en L3 Informatique — Admis en Master Réseaux, Systèmes & Cybersécurité (Sorbonne)
🔗 github.com/abdallah-76
🔗 LinkedIn
MIT — libre d'utilisation et de modification.